1045
21169
Van egy listám másodpercek alatt, például:
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
Minden második másodpercnél kezdődő, 2 másodperces ablakhoz szeretnék egy listát adni a 2 másodperces ablakba eső idők listájáról. Tehát a fenti példa szerint:
[0.10218048, 1.20851996, 1.46800021, 1.73429061]
[1.20851996, 1.46800021, 1.73429061, 2.71525848]
[2.71525848, 3.14781922, 3.63637958]
[3.14781922, 3.63637958]
[5.11147358, 5.97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352]
[7.65215123, 7.86108352, 8.52988247, 8.83068894]
[8.52988247, 8.83068894]
[10.07690977]
[10.07690977, 11.5386728]
[11.5386728, 12.01214112, 12.13307653]
[12.01214112, 12.13307653]
Az ablak hossza általában eltérhet a 2-től.
Hogyan lehet ezt megtenni? 
Úgy gondolom, hogy a "2 másodperc hosszú ablakoknál minden második ablaknál kezdődő második ablaknál" alapú növekedést értett, és nem átfedést. Két másodperces időközönként ugyanaz, de mivel változtatni akarja a hosszát, egy másodperces átfedés 0-3, 2-5, 4-7 lenne, de a növekedés 0-3, 1-4, 2- 5. Érdekes volt azonban mindkettőre megoldást találni mindkettőre.
Ha feltételezzük, hogy L rendezve van, és minden elem pozitív, és a második intervallum egész számmal kezdődik, akkor ezt a módszert használhatjuk:
matematika importálása
a gyűjteményekből importálja az alapértelmezett beállítást
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
my_ranges = defaultdict (lista)
intervallum_szélesség = 2
x-re L-ben:
felső_kötés = math.ceil (x)
alsó_kötés = felső_kötés - intervallumszélesség
alsó_kötés = max (0, alsó_kötés)
y tartományban (alsó_kötés, felső_kötés):
my_ranges [y] .append (x)
egy a rendezésre (saját_tartományok):
nyomtatás (saját_tartományok [a])
Nem tudom, akarja-e látni, hogy vannak-e üres tartományok. De az defaultdict üres tartományokat is kiír, ha akarja. Használja ezt a sort a "for a a sorted" helyett:
a tartományban (min (tartományok), max (tartományok) + 1):
Ha a 0-3, 2-5, 4-7 tartományokat szeretné, akkor ez működik:
matematika importálása
a gyűjteményekből importálja az alapértelmezett beállítást
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
intervallum_szélesség = 2
my_ranges_2 = defaultdict (lista)
x-re L-ben:
feltétlenül_in = (x // (intervallumszélesség - 1)) * (intervallumszélesség - 1) # x alatti intervallumszélesség legkisebb többszöröse
#print ("Hozzáadás", x, "hozzáadás", feltétlenül_in)
my_ranges_2 [feltétlenül_in] .append (x)
ha x  = 0: # például, ha x értéke 2,3, és van 0,3 2,5 stb. Feltételezem, hogy az ablak hossza egész szám, és ha nem, akkor sokkal több tennivalónk van, mert a szám több tömbben is szerepelhet. Talán lehet egy kis időnk, növekszik (interval_width - 1)
#print ("++ Hozzáadás", x, "hozzá", feltétlenül_in - intervallumszélesség + 1)
my_ranges_2 [feltétlenül_in - intervallumszélesség + 1] .append (x)
az a számára rendezve (saját_tartományok_2):
nyomtatás (a, saját_tartomány_2 [a])
# nyomtatás (saját_tartomány_2 [a])
Gyanítom, hogy vannak olyan részletek, amelyeket elfelejtettem, de remélhetőleg szükség szerint meg tudod változtatni az interval_width elemet, hogy megbizonyosodj arról, hogy a kódom azt csinálja, amit reméltél, és tudasd velem, mire van szükséged pontosan.
|
Egy lehetséges megoldás, amelyet javasolni tudok, bizonyos értelemben "hatékony", hogy a bemenő adatokon keresztül csak egyszer ismétlődik, és nincsenek függőségei. A költség természetesen az, hogy tiszta pythonba van írva (lehet, hogy több optimalizált kód van), és hogy több követési változót vezet be az ismétlés megakadályozása érdekében (és így kevésbé pythonikus).
def sliding_window (adatok, időtartam, start = 0, átfedés = 1):
eredmény = []
data_idx = 0
eredmény_idx = 0
felső = kezdet + időtartam
alsó = kezdet
next_lower = felső - átfedés
# belső segítő az üres belső listák kitöltéséhez a beszúrási pontig és a beszúrásig
def pad_and_append (at):
míg len (eredmény) <= itt:
result.append ([])
eredmény [at] .append (adatok [data_idx])
# iterál a bemeneti adatokon keresztül
míg data_idx  a:
ha x  = l [0]) & (L  = i) & (L